package common.serializer.myCode;

import common.Message.MessageType;
import common.Message.RpcRequest;
import common.Message.RpcResponse;
import common.serializer.mySerializer.Serializer;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import lombok.AllArgsConstructor;

@AllArgsConstructor
public class MyEncoder extends MessageToByteEncoder {

    private Serializer serializer;

    /**
     * @param ctx netty的上下文对象：管道上下文，包含通道和处理器相关信息
     * @param msg 需要编码的消息对象
     * @param out netty提供的字节缓冲区，编码的字节数据写入其中
     * @throws Exception netty在写出数据时候会调用该方法，将Java对象编码成二进制数据
     */
    @Override
    protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception {

        // 打印消息对象的类名，用于调试编码过程中消息的类型
        System.out.println("编码器：" + msg.getClass());
        // 判断消息是否是RpcRequest类型或者RpcResponse类型,写入输出流中
        if (msg instanceof RpcRequest) {
            out.writeShort(MessageType.REQUEST.getCode());
        } else if (msg instanceof RpcResponse) {
            out.writeShort(MessageType.RESPONSE.getCode());
        }
        // 写入当前序列化器的类型标识（short类型）
        out.writeShort(serializer.getType());
        // 将消息转化为字符数组
        byte[] bytes = serializer.serialize(msg);
        // 写入消息的字节长度
        out.writeInt(bytes.length);
        // 将字节数据内容写入输出缓冲区
        out.writeBytes(bytes);
    }
}
